# 37. time模块 - 时间模块

# time时间模块

时间分为三种格式

  1. 时间戳时间格式:又称为格林威治时间,是float数据类型,就是浮点类型,这格式是专门给机器用的
    1. 时间戳时间格式的计算起步时间:
      1. 英国伦敦的时间 1970.1.1 0:0:0
      2. 北京时间 1970.1.1 8:0:0
    2. 时间是按毫秒进行存储的
    3. 如果需要得出时间, 程序会先获取时间戳时间格式类型的数据,就是一大串浮点数,在按起步时间进行计算,就可以得出当前的时间,或未来的时间,或过去的时间
  2. 结构化时间:时间对象,元组(struct_time)类型
    1. 时间戳时间格式转换后的数据就是结构化时间
    2. 能够通过属性名来获取时间对象中的值
  3. 格式化时间:字符串时间、自定义格式时间,属于str类型的数据,这格式只能给用户看,机器是无法识别的
    1. 可以根据需要的格式来显示时间

# 时间戳时间格式 - time

这种就为时间戳时间格式的数据时间

import time
print(time.time())

执行结果:
1568966977.5773466

# 结构化时间 - localtime

# 结构化时间元素

结构化时间元素 :元组(struct_time) ,元组共有9个元素共九个元素:(年,月,日,时,分,秒,周,年天数)

索引(Index) 属性(Attribute) 值(Values)
0 tm_year(年) 比如2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 60
6 tm_wday(周) 0 - 6(0表示周一)
7 tm_yday(一年中的第几天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为

# 简单使用

这种就是结构化时间,是先把时间戳时间格式的数据进行计算得出来的

import time
print(time.localtime())

执行结果:
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=20, tm_hour=16, tm_min=11, tm_sec=40, tm_wday=4, tm_yday=263, tm_isdst=0)


## 还可以这样,使用结构化时间元素
import time
print(time.localtime())
print(time.localtime().tm_year)
print(time.localtime().tm_mon)
print(time.localtime().tm_mday)

执行结果:
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=20, tm_hour=16, tm_min=16, tm_sec=22, tm_wday=4, tm_yday=263, tm_isdst=0)
2019
9
20
# 有没有猜到,还可以直接获取time.localtime()结果中的某个对应的值,称为结构化时间元素

# 格式化时间 - strftime

格式化时间是用时间字符串来进行格式化的

# 常用时间字符串

时间字符串 用法
%Y 四位数的年份
%m 月份(01-12)
%d 天分,某个月内中的一天(0-31)
%H 24小时制,小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)

# 时间字符串大全

时间字符串 用法
%Y 四位数的年份
%y 二位数年份,比如2019显示为19
%m 月份(01-12)
%d 天分,某个月内中的一天(0-31)
%H 24小时制,小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%A 本地完整星期名称
%a 本地简化星期名称
%B 本地完整的月份名称
%b 本地简化的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身

# 简单使用

最最常用的时间格式

import time
print(time.strftime("%Y-%m-%d %H:%M:%S"))

执行结果:
2019-09-20 16:37:52

# ===================================

# 三大格式转换

格式转换是有顺序的,所以这里我分为二部分,顺时针转换,逆时针转换

# 顺时针转换

时间戳时间格式 ==> 结构化时间 ==> 格式化时间

# 时间戳时间格式 转换 结构化时间 -localtime / gmtime

有二个方法

  1. localtime:转换成北京时间起步
  2. gmtime:转换成美国伦敦的时间起步

localtime()方法 - 结构化北京时间

localtime方法默认获取当前最新的时间戳时间数据,

也可以指定时间戳时间数据:localtime(时间戳时间数据)

默认的localitime = time.localtime(time.time())

格式:time.localitime (时间戳时间) , 如果时间戳时间参数不写,默认就是最新的时间戳时间

import time
print(time.localtime()) ## 默认获取当前
print(time.localtime(time.time())) ## 指定时间戳,也是指定了最新的时间戳
print(time.localtime(10000000000)) ## 指定时间戳,随便指定的时间戳

执行结果:
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=20, tm_hour=17, tm_min=5, tm_sec=20, tm_wday=4, tm_yday=263, tm_isdst=0)
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=20, tm_hour=17, tm_min=5, tm_sec=20, tm_wday=4, tm_yday=263, tm_isdst=0)
time.struct_time(tm_year=2286, tm_mon=11, tm_mday=21, tm_hour=1, tm_min=46, tm_sec=40, tm_wday=6, tm_yday=325, tm_isdst=0)

## 可以对比一下,第一跟第二的结果是不是一样

gmtime()方法 - 结构化美国伦敦时间

gmtime方法默认获取当前最新的时间戳时间数据,

也可以指定时间戳时间数据:gmtime(时间戳时间数据)

默认的gmtime= time.gmtime(time.time())

格式:time.gmtime(时间戳时间) , 如果时间戳时间参数不写,默认就是最新的时间戳时间

import time
print(time.gmtime()) ## 默认获取当前
print(time.gmtime(time.time())) ## 指定时间戳,也是指定了最新的时间戳
print(time.gmtime(10000000000)) ## 指定时间戳,随便指定的时间戳

执行结果:
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=20, tm_hour=9, tm_min=6, tm_sec=41, tm_wday=4, tm_yday=263, tm_isdst=0)
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=20, tm_hour=9, tm_min=6, tm_sec=41, tm_wday=4, tm_yday=263, tm_isdst=0)
time.struct_time(tm_year=2286, tm_mon=11, tm_mday=20, tm_hour=17, tm_min=46, tm_sec=40, tm_wday=5, tm_yday=324, tm_isdst=0)

## 可以对比一下,第一跟第二的结果是不是一样

# 结构化时间 转换 格式化时间 - strftime

格式:time.strftime("格式定义","结构化时间") 结构化时间参数若不传,则显示当前时间

import time
## 默认获取当前最新结构化时间进行格式化
print(time.strftime("%Y-%m-%d %H:%M:%S")) 
## 指定结构化时间,获取当前最新结构化时间进行格式化
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) 
## 指定结构化时间,获取指定结构化时间进行格式化
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(10000000000)))

执行结果:
2019-09-20 17:17:00
2019-09-20 17:17:00
2286-11-21 01:46:40

# 逆时针转换

格式化时间 ==> 结构化时间 ==> 时间戳时间格式

# 格式化时间 转换 结构化时间 -strptime

格式:time.strptime(时间字符串,字符串对应格式)

import time
print(time.strptime("2019-09-20","%Y-%m-%d"))
print(time.strptime("2019-09-20 17:20:07","%Y-%m-%d %H:%M:%S"))
print(time.strptime("2286-11-21 01:46:40","%Y-%m-%d %H:%M:%S"))

执行结果:
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=20, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=263, tm_isdst=-1)
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=20, tm_hour=17, tm_min=20, tm_sec=7, tm_wday=4, tm_yday=263, tm_isdst=-1)
time.struct_time(tm_year=2286, tm_mon=11, tm_mday=21, tm_hour=1, tm_min=46, tm_sec=40, tm_wday=6, tm_yday=325, tm_isdst=-1)

# 结构化时间 转换 时间戳时间格式 -tuple

格式:time.mktime(结构化时间)

import time
print(time.mktime(time.localtime()))
print(time.mktime(time.localtime(10000000000)))
time_strptime = time.strptime("2019-09-20 17:20:07", "%Y-%m-%d %H:%M:%S")
print(time.mktime(time_strptime))

执行结果:
1568971734.0
10000000000.0
1568971207.0

# ===================================

# 练习题

# 计算本月一号的时间戳时间

复杂点的

## 通过结构化时间
print(time.mktime(time.strptime("%s%s01"% (time.localtime().tm_year,time.localtime().tm_mon),"%Y%m%d")))

执行结果:
1567267200.0 

## 通过格式化时间
print(time.mktime(time.strptime(time.strftime("%Y%m01"),"%Y%m%d")))

执行结果:
1567267200.0

简单点的

## 通过结构化时间
time_strptime = time.strptime("%s%s01"% (time.localtime().tm_year,time.localtime().tm_mon),"%Y%m%d")
print(time.mktime(time_strptime))

执行结果:
1567267200.0 

## 通过格式化时间
time_strptime = time.strptime(time.strftime("%Y%m01"),"%Y%m%d")
print(time.mktime(time_strptime))

执行结果:
1567267200.0

# 计算二个时间差

计算两个时间之间的格式化时间差

二个时间:

1. 2018-02-01 21:58
2. 2018-10-01 19:27
so1 = time.mktime(time.strptime("2018-02-01 21:58","%Y-%m-%d %H:%M"))
so2 = time.mktime(time.strptime("2018-10-01 19:27","%Y-%m-%d %H:%M"))
so = so2 - so1
print(so)
print(time.strftime("%m-%d %H:%M",time.localtime(so)))

执行结果:
08-31 05:29